Developer

【SQL基礎】ORDER BY句 列番号による並べ替え
2021.02.28
Lv1

【SQL基礎】ORDER BY句 列番号による並べ替え

ORDER BY句では、並べ替えの基準となる「カラム名」を指定するのが一般的です。
参考:ORDER BY句の基本構文

一方で、ORDER BY句に「列番号」を指定して並べ替えを行うことも可能です。
列番号というのは、SELECT句で指定したカラムに対して1から順に振られた番号のことです。
以下の画像のような場合、nameカラム(赤枠)には1、ageカラム(青枠)には2の列番号が振られます。


この列番号を使うことで、並べ替えの基準となるカラムを指定することができます。

書式は以下の通りです。(昇順の場合)

SELECT データを取得するカラム名
FROM 対象テーブル名
ORDER BY 並べ替えの基準にする列番号 ASC;

※降順の場合は”ASC”のところを”DESC”としてください。

ただし、列番号による並べ替えは推奨されません
どういう動作を意図しているのかがわかりにくいからです。
本記事では列番号による並べ替えを扱いますが、実際に使用する目的ではなく知見を深める目的でお読みいただきたいと思います。

本記事では例として以下のテーブル(テーブル名:teachers)を使用します。


1.SELECT句で特定のカラムを指定した場合

列番号はSELECT句で指定した順に振られます。
以下の二つの例で確認しましょう。

例1-1.teachersテーブルからnameカラムとageカラムを抽出し、ageカラムを基準に並べ替える(昇順)。

SELECT name, age
FROM teachers
ORDER BY 2 ASC;

例1-2.teachersテーブルからageカラムとnameカラムを抽出し、ageカラムを基準に並べ替える(昇順)。

SELECT age, name
FROM teachers
ORDER BY 1 ASC;

例1-1と例1-2ではSELECT句におけるカラム指定の順番を変えています。
例1-1ではageカラムの列番号は2ですが、例1-2ではageカラムの列番号は1です。
SELECT句の書き方によって指定する番号が変わるので、ORDER BY句だけを見ても何を基準に並べ替えているのかがわかりません。


2.SELECT句で全てのカラムを指定した場合

SELECT句で全てのカラムを指定した場合は、指定したテーブルの定義に従って列番号が振られます。
teachersテーブルの場合はidが1、nameが2、addressが3、ageが4、birthdayが5、scoreが6、studentsが7です。

例2.teachersテーブルから全てのカラムを抽出し、ageカラムを基準に並べ替える(昇順)。

SELECT *
FROM teachers
ORDER BY 4 ASC;

例2のような場合は、ORDER BY句、SELECT句を見ても何を基準に並べ替えているのかがわかりません。


学習のポイント

・ORDER BY句では列番号を指定することができる。
・意図する動作がわかりづらいため、列番号による並べ替えは基本的に使用するべきではない。


練習問題

問題として使用するデータは「SQL練習問題」のものを使用しています。
以下からダウンロード可能です。
また、ダウンロードしたら以下のようにしてworldcup2014データベースを作成し、インポートしてください。
※worldcup2014.zip解凍してできるworldcup2014.sqlファイルをCドライブ直下に配置した場合。

worldcup2014.zip

[sql] CREATE DATABASE worldcup2014;

use worldcup2014

source C:\worldcup2014.sql
[/sql]

1.2014年ワールドカップ開催時の世界ランキングを上位から順に表示してください。その際、ランキング、国名、グループ名の順に表示されるようにしてください。
countriesテーブル(id,name,ranking,group_nameの4つのカラムで構成されている)を使って答えを導いてください。

答え
[sql] SELECT ranking, name, group_name
FROM countries
ORDER BY ranking ASC;
[/sql]

(実行結果は一部省略)

 

SELECT句で表示したい順にカラムを指定します。
ランキング上位から順に表示するために、ORDER BY句ではrankingカラムを基準にして昇順で並べ替えを行います。

また、以下のように列番号を指定しても同様の結果を得られますが、非推奨です。

[sql] SELECT ranking, name, group_name
FROM countries
ORDER BY 1 ASC;
[/sql]

 

 

 

連載目次リンク

SQL基礎 連載目次

関連する連載リンク

SQL練習問題 一覧まとめ